package practice;

// 扫描指定目录，并找到名称或者内容中包含指定字符的所有普通文件（不包含目录）

import java.io.*;
import java.util.Scanner;

public class Demo3 {
    public static void main(String[] args) {
        // 先输入目录/ 扫描路径
        Scanner in = new Scanner(System.in);
        System.out.println("请输入扫描路径：");
        File dir = new File(in.next());
        System.out.println("请输入查询关键字：");
        String toFind = in.next();

        // 扫描路径
        scanDir(dir,toFind);
    }

    private static void scanDir(File dir, String toFind) {
        File[] files = dir.listFiles();
        if (files==null) {
            System.out.println("输入错误！");
            return;
        }
        // 说明该目录正确，进行遍历
        for (File f:files) {
            if(f.isDirectory()) {
                scanDir(f,toFind);
            }
            if(f.isFile()) {
                // 是文件就进行扫描判断是否包含
                checkFind(f,toFind);
            }
        }
    }

    private static void checkFind(File f, String toFind) {

        // 看文件名中是否包含
        if(f.getName().contains(toFind)) {
            System.out.println("文件名"+f.getName()+"中包含关键字"+toFind);
        }
        // 要看内容中是否包含：按行读取内容+拼接 （利用字节流！+Scanner！）
        try(InputStream inputStream = new FileInputStream(f)) {
            StringBuilder stringBuilder = new StringBuilder();
            // 打开文件之后使用Scanner进行读文件
            Scanner scanner = new Scanner(inputStream);

            while (scanner.hasNextLine()) { // 按行读取
                stringBuilder.append(scanner.nextLine()+"\n");

                // 存储一行判断一下是否包含
                if(stringBuilder.indexOf(toFind) > -1) {
                    // 能够找到就说明存在
                    System.out.println(f.getCanonicalFile()+"文件内容中包含了关键字"+toFind);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
